home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / ABUSESRC.ZIP / AbuseSrc / macabuse / src / net / mac / ottcp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-20  |  9.8 KB  |  434 lines

  1. #include "ottcp.hpp"
  2. #include <ctype.h>
  3.  
  4. ot_tcpip_protocol ot_tcpip;
  5.  
  6. /*
  7. FILE *log_file=NULL;
  8. extern int net_start();
  9. void net_log(char *st, void *buf, long size)
  10. {
  11.     
  12.   if (!log_file) 
  13.   {
  14.     if (net_start())
  15.       log_file=fopen("client.log","wb");
  16.     else
  17.       log_file=fopen("server.log","wb");
  18.   }
  19.  
  20.  
  21.     fprintf(log_file,"%s%d - ",st,size);
  22.     int i;
  23.     for (i=0;i<size;i++) 
  24.       if (isprint(*((unsigned char *)buf+i)))
  25.         fprintf(log_file,"%c",*((unsigned char *)buf+i));
  26.       else fprintf(log_file,"~");
  27.  
  28.     fprintf(log_file," : ");
  29.  
  30.     for (i=0;i<size;i++) 
  31.     fprintf(log_file,"%02x, ",*((unsigned char *)buf+i),*((unsigned char *)buf+i));
  32.     fprintf(log_file,"\n");
  33.     fflush(log_file);
  34.  
  35. } */
  36.  
  37. pascal void ot_tcp_EventHandler(void*, OTEventCode event, OTResult result, void* cookie)
  38. {
  39.     OTEventCode tempevent = 0;
  40.     ot_tcp_socket *sckt = (ot_tcp_socket*)cookie;
  41.  
  42.     switch(event)
  43.     {
  44.     case T_OPENCOMPLETE:
  45.         sckt->err = (OSStatus)result;
  46.         sckt->code = event;
  47.         break;
  48.     case T_DATA:
  49.         sckt->ready = 1;
  50.         break;
  51.     case T_BINDCOMPLETE:
  52. //        gBindCompleted = 1;
  53.         break;
  54.     case T_ORDREL:
  55. //        gCallRcvOrdDiscon = 1;
  56.         break;
  57.     default:
  58.         // OTDebugBreak("EventHandler got unexpected event");
  59. //        tempevent = event;
  60.         break;
  61.     }
  62.     return;
  63. }
  64.  
  65. ot_tcp_socket::ot_tcp_socket()
  66. {
  67.     TEndpointInfo    info;
  68.     OSStatus err;
  69.  
  70.     // create TCP endpoint structure for MAC
  71.     ep = OTOpenEndpoint(OTCreateConfiguration(kTCPName), 0, &info, &err);
  72.     if ( ep == NULL || err != kOTNoError )
  73.     {
  74.         ep = NULL;
  75.         fprintf(stderr,"ERROR: OpenEndpoint(\"TCP\") failed with %d\n", err);
  76.         return;
  77.     }
  78.  
  79.     // required by mac?
  80.     err = ep->SetSynchronous();
  81.     if ( err != kOTNoError )
  82.     {
  83.         fprintf(stderr,"ERROR: SetSynchronous() failed with %d\n", err);
  84.         return;
  85.     }
  86.  
  87.     // Install notifier of communication events
  88.     err = ep->InstallNotifier(ot_tcp_EventHandler, this);
  89.     if ( err != kOTNoError )
  90.     {
  91.         fprintf(stderr, "ERROR: InstallNotifier() failed with %d\n", err);
  92.         return;
  93.     }
  94.     listening = 0;
  95. }
  96.  
  97. int ot_tcp_socket::read(void *buf, int size, net_address **addr) 
  98. {
  99.   int result;
  100.   
  101.   result = ep->Rcv(buf, size, 0);
  102.   if (addr) *addr=NULL;
  103.   
  104.   if (result>=0)
  105.       return result;
  106.   else
  107.   {
  108.       // save error code for next select
  109.       return 0;
  110.   }
  111. }
  112.  
  113. int ot_tcp_socket::write(void *buf, int size, net_address *addr)
  114.   if (addr) fprintf(stderr,"Cannot change address for this socket type\n");
  115.   
  116.     result = ep->Snd(buf, len, 0);
  117.     if (result >= 0)
  118.         return result;
  119.     else if (result != kOTFlowErr) 
  120.     {
  121.         // store error for next select
  122.         return 0;
  123.     }
  124. }
  125.  
  126. int ot_tcp_socket::listen(int port)
  127. {
  128.   sockaddr_in host;
  129.   memset( (char*) &host,0, sizeof(host));
  130.   host.sin_family = AF_INET;
  131.   host.sin_port = htons(port);
  132.   host.sin_addr.s_addr = htonl(INADDR_ANY);
  133.   if (ep->Bind(ep, (struct sockaddr *) &host, sizeof(sockaddr_in))==-1)
  134.   {
  135.     fprintf(stderr,"net driver : could not bind socket to port %d\n",port);
  136.     return 0;
  137.   }
  138.   if (::listen(fd,5)==-1)
  139.   {
  140.     fprintf(stderr,"net driver : could not listen to socket on port %d\n",port);    
  141.     return 0;
  142.   }
  143.   listening=1;
  144.   return 1;
  145. }
  146.  
  147. net_socket *ot_tcp_socket::accept(net_address *&addr);
  148.   if (listening)
  149.   {
  150.     struct sockaddr_in from;
  151.     int addr_len=sizeof(from);
  152.     int new_fd=::accept(fd,(sockaddr *)&from,&addr_len);
  153.     if (new_fd>=0)
  154.     {
  155.             addr=new ip_address(&from);
  156.             return new tcp_socket(new_fd);
  157.     }
  158.     else
  159.     { addr=NULL; return 0; }
  160.   }
  161. }
  162.  
  163. int ot_tcp_socket::connect(ot_ip_address addr);
  164.     TBind ret;
  165.     InetAddr retsin;
  166.  
  167.     ret.addr.maxlen = sizeof(struct InetAddress);
  168.     ret.addr.buf = (unsigned char *) &retsin;
  169.  
  170.     // bind TCP to current address and port
  171.     err = fd->Bind(nil, &ret);
  172.     if ( err != kOTNoError )
  173.     {
  174.         printf("ERROR: Bind() failed with %d\n", err);
  175.         break;
  176.     }
  177.     err = ep->SetSynchronous();
  178.     if ( err != kOTNoError )
  179.     {
  180.         printf("ERROR: SetSynchronous() failed with %d\n", err);
  181.         break;
  182.     }
  183.  
  184.     def_addr.addr.len = sizeof(struct InetAddress);
  185.     def_addr.addr.buf = (unsigned char *) &sndsin;
  186.  
  187.     err = ep->Connect(&sndcall, nil);
  188.     if ( err != kOTNoError )
  189.     {
  190.         printf("ERROR: Connect() failed with %d\n", err);
  191.         break;
  192.     }
  193. }
  194.  
  195. pascal void ot_udp_EventHandler(void*, OTEventCode event, OTResult, void*)
  196. {
  197.     if (event == T_DATA)
  198.     {
  199.         gDataToRead = 1;
  200.         return;
  201.     }
  202.     if (event == T_BINDCOMPLETE)
  203.     {
  204.         gBindCompleted = 1;
  205.         return;
  206.     }
  207.     return;
  208. }
  209.  
  210. ot_udp_socket::ot_udp_socket()
  211. {
  212.     TEndpointInfo    info;
  213.     OSStatus err;
  214.  
  215.     fd = OTOpenEndpoint(OTCreateConfiguration(kUDPName), 0, &info, &err);
  216.     if ( ep == NULL || err != kOTNoError )
  217.     {
  218.         ep = NULL;
  219.         fprintf(stderr,"ERROR: OpenEndpoint(\"UDP\") failed with %d\n", err);
  220.         break;
  221.     }
  222.     
  223.     // Install notifier
  224.     err = ep->InstallNotifier(ot_udp_EventHandler, this);
  225.     if ( err != kOTNoError )
  226.     {
  227.         fprintf(stderr, "ERROR: InstallNotifier() failed with %d\n", err);
  228.         break;
  229.     }
  230.  
  231. }
  232.  
  233. int ot_udp_socket::read(void *buf, int size, net_address **addr);
  234. {
  235.   int tr;
  236.   if (addr) 
  237.   {
  238.     *addr=new ip_address;
  239.     int addr_size=sizeof(ip_address::addr);
  240.     tr=recvfrom(fd,buf,size,0, (sockaddr *) &((ip_address *)(*addr))->addr,&addr_size);
  241.   } else
  242.     tr=recv(fd,buf,size,0);
  243.   return tr;
  244. }
  245.  
  246. int ot_udp_socket::write(void *buf, int size, net_address *addr);
  247. {
  248.     OSStatus    err = kOTNoError;
  249.     TUnitData    unitdata;
  250.     char        mystr[255];
  251.  
  252.     unitdata.addr.len = sizeof (struct InetAddress);
  253.   if (addr)
  254.          unitdata.addr.buf = (UInt8*) &((ot_ip_address *)addr->addr);
  255.   else
  256.          unitdata.addr.buf = (UInt8*) &def_addr;
  257.     unitdata.opt.len = 0;
  258.     unitdata.opt.buf = 0;
  259.     unitdata.udata.len = size;
  260.     unitdata.udata.buf = (UInt8*) buf;
  261.  
  262.     err = ep->SndUData( &unitdata);
  263.  
  264.     if ( err != kOTNoError )
  265.     {
  266.         fprintf(stderr, "SndUData() returns %d\n", err);
  267.     }
  268.     else 
  269.         return size;
  270. }
  271.  
  272. int ot_udp_socket::listen(int port);
  273. {
  274.     sockaddr_in host;
  275.     memset( (char*) &host,0, sizeof(host));
  276.     host.sin_family = AF_INET;
  277.     host.sin_port = htons(port);
  278.     host.sin_addr.s_addr = htonl(INADDR_ANY);
  279.     if (bind(fd, (struct sockaddr *) &host, sizeof(sockaddr_in))==-1)
  280.     {
  281.       fprintf(stderr,"net driver : could not bind socket to port %d\n",port);
  282.       return 0;
  283.     }
  284.     return 1;
  285. }
  286.  
  287. net_address *tcpip_protocol::get_local_address()
  288. {
  289.   char my_name[100];                              // now check to see if this address is 'hostname'
  290.   gethostname(my_name,100);
  291.   struct hostent *l_hn=gethostbyname(my_name);  
  292.   ip_address *a=new ip_address();
  293.   memset(&a->addr,0,sizeof(a->addr));
  294.   memcpy(&a->addr.sin_addr,*l_hn->h_addr_list,4);  
  295. }
  296.  
  297. net_address *tcpip_protocol::get_node_address(char *&server_name, int def_port, int force_port)
  298. {
  299.   char name[256],*np;
  300.   np=name;
  301.   while (*server_name && *server_name!=':' && *server_name!='/')
  302.     *(np++)=*(server_name)++;
  303.   *np=0;
  304.   if (*server_name==':')
  305.   {
  306.     server_name++;
  307.     char port[256],*p;
  308.     p=port;
  309.     while (*server_name && *server_name!='/')
  310.       *(p++)=*(server_name++);
  311.     *p=0;
  312.     int x;
  313.     if (!force_port)
  314.     {
  315.       if (sscanf(port,"%d",&x)==1) def_port=x;
  316.       else return 0;
  317.     }
  318.   }
  319.  
  320.   if (*server_name=='/') server_name++;
  321.  
  322.   hostent *hp=gethostbyname(name);
  323.   if (!hp)
  324.   { 
  325.     fprintf(stderr,"unable to locate server named '%s'\n",name);
  326.     return 0;
  327.   }
  328.   
  329.  
  330.   sockaddr_in host;
  331.   memset( (char*) &host,0, sizeof(host));
  332.   host.sin_family = AF_INET;
  333.   host.sin_port = htons(def_port);
  334.   host.sin_addr.s_addr = htonl(INADDR_ANY);
  335.   memcpy(&host.sin_addr,hp->h_addr,hp->h_length);
  336.   return new ip_address(&host);
  337. }
  338.  
  339. net_socket *tcpip_protocol::connect_to_server(net_address *addr, net_socket::socket_type sock_type)
  340. {
  341.   if (addr->protocol_type()!=net_address::IP)
  342.   {
  343.     fprintf(stderr,"Procotol type not supported in the executable\n");
  344.     return NULL;
  345.   }
  346.  
  347.   int socket_fd=socket(AF_INET,sock_type==net_socket::SOCKET_SECURE ? SOCK_STREAM : SOCK_DGRAM,0);
  348.   if (socket_fd<0) 
  349.   {
  350.     fprintf(stderr,"unable to create socket (too many open files?)\n");
  351.     return 0;
  352.   }
  353.  
  354.   int zz;
  355.   if (setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,(char *)&zz,sizeof(zz))<0)
  356.   {
  357.     fprintf(stderr,"could not set socket option reuseaddr");
  358.     return 0;
  359.   }
  360.  
  361.     
  362.   if (connect(socket_fd, (struct sockaddr *) &((ip_address *)addr)->addr, sizeof( ((ip_address *)addr)->addr ))==-1)
  363.   { 
  364.     fprintf(stderr,"unable to connect\n");
  365.     close(socket_fd);
  366.     return 0;
  367.   }
  368.  
  369.   if (sock_type==net_socket::SOCKET_SECURE)
  370.     return new tcp_socket(socket_fd);
  371.   else
  372.     return new udp_socket(socket_fd);
  373. }
  374.  
  375.  
  376. net_socket *tcpip_protocol::create_listen_socket(int port, net_socket::socket_type sock_type, char *name)
  377. {
  378.   int socket_fd=socket(AF_INET,sock_type==net_socket::SOCKET_SECURE ? SOCK_STREAM : SOCK_DGRAM,0);
  379.   if (socket_fd<0) 
  380.   {
  381.     fprintf(stderr,"unable to create socket (too many open files?)\n");
  382.     return 0;
  383.   }
  384. /*  int zz;
  385.   if (setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,(char *)&zz,sizeof(zz))<0)
  386.   {
  387.     fprintf(stderr,"could not set socket option reuseaddr");
  388.     return 0;
  389.   } */
  390.  
  391.  
  392.   net_socket *s;
  393.   if (sock_type==net_socket::SOCKET_SECURE)
  394.     s=new tcp_socket(socket_fd);
  395.   else s=new udp_socket(socket_fd);
  396.   if (s->listen(port)==0)
  397.   {   
  398.     delete s;
  399.     return 0;
  400.   }
  401.  
  402.   return s;
  403. }
  404.  
  405.  
  406. tcpip_protocol::tcpip_protocol()
  407. {
  408.   FD_ZERO(&master_set);  
  409.   FD_ZERO(&master_write_set);  
  410.   FD_ZERO(&read_set);
  411.   FD_ZERO(&exception_set);
  412.   FD_ZERO(&write_set); 
  413. }
  414.  
  415.  
  416. int tcpip_protocol::select(int block)
  417. {
  418.   memcpy(&read_set,&master_set,sizeof(master_set));
  419.   memcpy(&exception_set,&master_set,sizeof(master_set));
  420.   memcpy(&write_set,&master_write_set,sizeof(master_set));
  421.   if (block)
  422.     return ::select(FD_SETSIZE,&read_set,&write_set,&exception_set,NULL);
  423.   else
  424.   {
  425.     timeval tv={0,0};
  426.     return ::select(FD_SETSIZE,&read_set,&write_set,&exception_set,&tv);
  427.   }
  428. }
  429.  
  430.  
  431.